/*清空数据空间*/ …… /*配置数据空间*/ *(pAceReg+0x0100) = 0x0000; /*堆栈指针A配置*/ /*配置查询表*/ for(i=0;i<0x60;i++) { *(pAceReg+0x0140+i) = 0x0400+i*32; } for(i=0;i<0x20;i++) { *(pAceReg+0x01A0+i) = 0x0420; } /*初始化发送消息*/ …… 3.2 消息中断处理设计 在初始化中将BU-61580的中断响应设置为消息结束中断,所以在每次完成消息的接受或发送后,BU-61580都会向dsp发送中断请求,当dsp收到中断请求后,产生中断并进入中断处理程序,对于需要立即处理的消息,在中断内直接处理,对以处理量较大消息设消息标志,放主程序处理,主程序根据中断标志处理数据。 在进入中断处理程序后,首先需要进行的工作是从消息堆栈中读出消息描述,根据消息描述进行标志置位及消息处理。在从消息堆栈中读取消息时需要注意以下几个问题。 (1)消息堆栈长度为0x100、每个消息描述长度为4,可存储64个消息描述,当消息描述超过64时会产生溢出并循环覆盖,当接收将要溢出的最后一帧消息后,其堆栈指针会从0x0fc变为0x000,此时进行消息描述读取时需注意。 (2)当1553中断请求未能及时响应,而再次接收到消息时,可能出现两种情况,第一种是,当dsp相应中断,准备去处理第一个消息时,第二个消息已经接收完毕,此时BU-61580的消息堆栈指针指向第二个消息的栈顶。若直接读取堆栈指针进行数据处理可能将前一个消息丢失;第二种情况是,当dsp响应中断,准备去处理第一个消息时,第二个消息正在接收,此时61580的消息堆栈指针指向第二个消息的栈顶。若直接读取堆栈指针进行数据处理的时不仅会丢失前一个消息,而且可能由于第二个消息未接收完毕,处理信息时还是旧信息,而有可能将最新的消息丢失。 针对上述两个问题,对消息处理进行以下设计:设置指针变量PreStackTop储存上一次处理消息时的栈顶,当有新消息时读取消息堆栈指针存放至StackTop,每一次中断都循环判断PreStackTop与StackTop是否相等,不相等时,根据PreStackTop读取并处理消息,然后将PreStackTop加4(若PreStackTop加4后为0x100则将PreStackTop清零),循环处理,直至与StackTop相等,同时在进行消息处理前首先判断消息是否接收完成,若未完成则结束中断处理,等待下一次中断处理。原理及程序流程见图3和图4。 4 结语 为了实现1553B总线通信,本文设计了一种基于dsp加61580的总线远程终端,可以作为总线终端进行通信,经测试该系统能较好地完成同总线控制器(BC)的正常通信,并且在消息量较大的情况下也能稳定工作。本文介绍了该系统硬件和软件的详细设计内容,具有较实用的参考价值。 参考文献 [1] 伏鹍,陈绍炜.61580芯片与DSP芯片的连接关系分析[J].信息安全与通信保密,2009(3):82-84. [2] 顾骧.用于1553总线控制器的存储单元设计[J].电子科技大学,2003,32(3). [3] 林强.dsp在1553总线接口技术中的应用[J].微计算机应用,2004,25(3). [4] MSL-STD-1553A/B NOTICE 2 RT and BC/RT/MT,ADVANCED COMMUNICATION ENGINE (ACE)[Z]. |